/**
 * 
 */
package mm.back.service;

import java.math.BigDecimal;
import java.util.List;

import mm.back.entity.Producto;
import mm.back.filtros.ProductosFiltro;
import mm.exceptions.MMGenericException;

/**
 * @author PUSDERKIS
 *
 */
public interface ProductoService {
	
	/**
	 * Crea un producto y valida que no exista en la base de datos.
	 * @param producto
	 * @throws MMGenericException
	 */
	void createProducto(Producto producto) throws MMGenericException;
	
	/**
	 * Guarda el producto.
	 * @param producto el producto a guardar.
	 * @throws MMGenericException el error.
	 */
	void saveProducto(Producto producto)throws MMGenericException;
	
	/**
	 * Devuelve el listado de productos.
	 * @param activo si el producto esta o no activo.
	 * Si el parametro es NULL no lo toma en cuenta para la busqueda.
	 * @return el listado de productos.
	 * @throws MMGenericException en caso de error.
	 */
	List<Producto> getProductos(Boolean activo) throws MMGenericException;
	
	/**
	 * Devuelve el listado de productos.
	 * @param filtro contiene los criterios de busqueda.
	 * @return el listado de productos.
	 * @throws MMGenericException en caso de error.
	 */
	List<Producto> getProductos(ProductosFiltro filtro) throws MMGenericException;

	/**
	 * Obtiene el producto.
	 * @param id
	 */
	Producto getProducto(Long id)  throws MMGenericException;
	
	/**
	 * Marca como inactivo un producto en la base de datos.
	 * @param id el id del producto.
	 * @throws MMGenericException en caso de error.
	 */
	void deleteProducto(Long id) throws MMGenericException;
	
	/**
	 * Registra la baja de una cantidad x de stock.
	 * @param idProducto el id del producto.
	 * @param cantidad la cantidad a dar de baja.
	 * @param motivo el motivo de la baja.
	 * @throws MMGenericException en caso de error.
	 */
	void registrarBajaStock(Long idProducto, BigDecimal cantidad,String motivo) throws MMGenericException;
	
	/**
	 * Registra la devolucion de un producto por parte de un cliente que no se identifico el número de venta.
	 * @param idProducto el id del producto.
	 * @param cantidad la cantidad
	 * @throws MMGenericException en caso de error.
	 */
	void registrarDevolucion(Long idProducto, BigDecimal cantidad) throws MMGenericException;
	
	
}
